package site.kitcheng.springboottest.test;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.Date;
import java.util.Map;

/**
 * ClassName: JwtGenerator
 * Package: site.kitcheng.springboottest.test
 * Description:
 *
 * @Author jiangCheng
 * @Create 2025/1/22 14:45
 * @Version 1.0
 */
public class JwtGenerator {

    private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 自动生成密钥

    /**
     * 生成包含自定义声明的 JWT
     *
     * @param username 用户名
     * @param additionalClaims 其他自定义字段
     * @return 生成的 JWT 字符串
     */
    public static String generateToken(String username, Map<String, Object> additionalClaims) {
        // 构建 JWT
        return Jwts.builder()
                .setSubject(username) // 设置主题
                .setIssuer("your-app") // 签发者
                .setIssuedAt(new Date()) // 签发时间
                .setExpiration(new Date(System.currentTimeMillis() + 3600)) // 过期时间（1小时后）
                .addClaims(additionalClaims) // 添加自定义字段
                .signWith(SECRET_KEY) // 签名
                .compact();
    }

    /**
     * 解析并打印 JWT 中的声明
     *
     * @param token JWT 字符串
     */
    public static void parseToken(String token) {
        Claims claims = Jwts.parserBuilder()
                .setSigningKey(SECRET_KEY) // 使用同一密钥
                .build()
                .parseClaimsJws(token)
                .getBody();

        // 打印标准声明
        System.out.println("Subject: " + claims.getSubject());
        System.out.println("Issuer: " + claims.getIssuer());
        System.out.println("Issued At: " + claims.getIssuedAt());
        System.out.println("Expiration: " + claims.getExpiration());

        // 打印自定义声明
        claims.forEach((key, value) -> {
            if (!key.equals("sub") && !key.equals("iss") && !key.equals("iat") && !key.equals("exp")) {
                System.out.println(key + ": " + value);
            }
        });
    }

    public static void main(String[] args) throws InterruptedException {
        // 添加自定义字段
        Map<String, Object> claims = Map.of(
                "email", "test@example.com",
                "phone", "1234567890",
                "role", "USER"
        );

        // 生成 JWT
        String jwt = generateToken("testUser", claims);
        System.out.println("Generated JWT: " + jwt);

        Thread.sleep(4000);
        // 解析 JWT
        try {
            parseToken(jwt);
        } catch (Exception e) {
            System.out.println("过期了");
        }
        String s = refreshToken(jwt);
        System.out.println("s = " + s);
        parseToken(s);
    }

    public static String refreshToken(String expiredToken) {
        try {
            Claims claims = Jwts.parserBuilder()
                    .setSigningKey(SECRET_KEY)
                    .build()
                    .parseClaimsJws(expiredToken)
                    .getBody();

            // 生成新的 Token
            return generateToken(claims.getSubject(), Map.of(
                    "email", claims.get("email"),
                    "phone", claims.get("phone"),
                    "role", claims.get("role")
            ));
        } catch (ExpiredJwtException e) {
            Claims claims = e.getClaims();
            return generateToken(claims.getSubject(), Map.of(
                    "email", claims.get("email"),
                    "phone", claims.get("phone"),
                    "role", claims.get("role")
            ));
        }
    }


}
